package gsw.tool.rxjava;

import gsw.tool.rxjava.operator.Function;

/**
 * 被观察者
 */
public class Observable<T> {

    //发送的通知
    private ObservableOnSubscribe onSubscribe;

    private Observable(ObservableOnSubscribe onSubscribe) {
        this.onSubscribe = onSubscribe;
    }

    /**
     * 创造操作符：用来创造Observable
     *
     * @param onSubscribe 发送的通知
     */
    public static <T> Observable<T> create(ObservableOnSubscribe<T> onSubscribe) {
        return new Observable<T>(onSubscribe);
    }

    /**
     * 订阅观察者，会发送一个通知，然后ObservableOnSubscribe调用Observer来处理通知
     *
     * @param observer 观察者
     */
    public void subscribe(Observer<? super T> observer) {
        onSubscribe.subscribe(observer);
    }

    /**
     * Map操作符：将传递的参数转换为另一个对象返回，如果将其转换为与之不同的对象，对应的返回的Flowable对象参数也会变为转换后的对象
     *
     * @param function 转换器
     * @param <R>      转换后的数据
     * @return 使用Map操作符包装的被观察者
     */
    public <R> Observable<R> map(Function<? super T, ? extends R> function) {
        return new Observable<>(new OnSubscribleLift(onSubscribe, function));
    }
}
